package com.iotek.ssm.controller;

import org.apache.commons.io.FileUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

/**
 * 下载
 * 提供资源给用户下载
 */
@Controller
public class DownloadController {

    @RequestMapping("/testdownload")
    public ResponseEntity<byte[]> testDownload(HttpServletRequest req) throws IOException {
        // 文件地址
        File downloadFile = createTheFileLocally();

        String filename = "测试下载.txt";

        HttpHeaders httpHeaders = new HttpHeaders();
        // 设置内容类型
        httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);

        // 解决中文乱码问题
        filename = new String(filename.getBytes("utf-8"), "iso-8859-1");

        // 设置文件名
        httpHeaders.setContentDispositionFormData("attachment", filename);

        ResponseEntity<byte[]> responseEntity = new ResponseEntity<byte[]>(
                FileUtils.readFileToByteArray(downloadFile),
                httpHeaders,
                HttpStatus.CREATED
        );

        return responseEntity;
    }

    private File createTheFileLocally() throws IOException {
        File downloadDir = new File("F:\\testFileDownload");
        downloadDir.mkdirs();           //创建此抽象路径名指定的目录，包括所有必需但不存在的父目录。
        downloadDir.deleteOnExit();     //在虚拟机终止时，请求删除此抽象路径名表示的文件或目录。

        File downloadFile = new File("F:\\testFileDownload\\downloadFile.txt");
        downloadFile.createNewFile();  //当且仅当不存在具有此抽象路径名指定名称的文件时，不可分地创建一个新的空文件。
        downloadFile.deleteOnExit();   //在虚拟机终止时，请求删除此抽象路径名表示的文件或目录。

        //使用字符流操作进行指定内容的写入
        FileWriter fw = new FileWriter(downloadFile.getAbsolutePath(), true);  //将内容写入到指定文本文件中--将数据写入文件末尾处，而不是写入文件开始处。
        BufferedWriter bw = new BufferedWriter(fw);    //将文本写入字符输出流，缓冲各个字符，从而提供单个字符、数组和字符串的高效写入
        bw.write(content());                //写入字符串
        bw.newLine();//换行
        bw.close();//关闭资源

        return downloadFile;
    }

    private String content(){
        String str = "";
        for (int i = 0;i < 33; i ++)
            str += "这是测试文件的内容！";
        return str;
    }
}
